package com.czxy.web.filter;

import com.czxy.domain.User;
import com.czxy.service.UserService;
import com.czxy.utils.CookieUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

@WebFilter("/*")
public class MyF01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, IOException, ServletException {

        //1. 把 两个参数转化成强大版本
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        /**
         * 处理请求中POST编码
         * 处理响应编码问题
         */
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //2.获取请求URI
        String requestURI = request.getRequestURI();

        // System.out.println("请求的资源是:"+requestURI);


        //3.放行一部分请求
        // 静态资源
        if (requestURI.contains("/images/") || requestURI.contains("/js/") || requestURI.contains("/css/")) {
            filterChain.doFilter(request, response);
            return;
        }

        // 特定资源
        if (requestURI.endsWith("index.jsp") ||
                requestURI.endsWith("login.jsp") ||
                requestURI.endsWith(request.getContextPath())) {
            filterChain.doFilter(request, response);
            return;
        }

        // 直接放行 UserServlet中的  登录, 获取验证码 功能

        if (requestURI.endsWith("/userServlet")) {
            String method = request.getParameter("method");
            if ("login".equals(method) || "getVcImg".equals(method)) {
                filterChain.doFilter(request, response);
                return;
            }
        }


        //4.对其余请求进行校验

        Object loginU = request.getSession().getAttribute("loginU");
        if (loginU != null) {
            // 登录状态
            // 直接放行

            // -------- 权限校验逻辑  开始----------
            // 当前登录的用户 不是管理员的时候  用户管理相关功能不允许访问
            if (!((User) loginU).getType().equals("管理员")) {
                if (requestURI.contains("/user/")) {
                    // 不放行,并且给提示
                    response.getWriter().write("您不是管理员权限,该页面不能访问 ");
                    return;
                }


                //  非管理员的时候 只让访问userServlet中 登录和获取验证码功能, 其余功能都不允许访问

                if (requestURI.endsWith("/userServlet")) {
                    String method = request.getParameter("method");
                    if (!"login".equals(method) && !"getVcImg".equals(method)) {

                        response.getWriter().write("您不是管理员权限,该功能 不能访问  ");
                        return;
                    }
                }


            }

            // -------- 权限校验逻辑  结束----------

            filterChain.doFilter(request, response);
            return;
        } else {
            // 未登录状态
            // 重定向到登录页面

            //--- 自动登录逻辑  开始------
            //1.从cookie中获取 autoInfo
            Cookie autoInfo = CookieUtils.getCookie(request.getCookies(), "autoInfo");
            if (autoInfo != null) {
                //2.使用autoInfo 中的信息 执行登录
                String[] ss = autoInfo.getValue().split("@");
                String username = URLDecoder.decode(ss[0], "UTF-8");
                String password = URLDecoder.decode(ss[1], "UTF-8");
                User user = new User();
                user.setLoginName(username);
                user.setLoginPwd(password);

                //3.如果登录成功, 把登录获取到的用户信息存储到session , 然后放行
                UserService us = new UserService();
                User loginU1 = us.login(user);
                if (loginU1 != null) {
                    //登录成功了
                    request.getSession().setAttribute("loginU", loginU1);
                    // 自动登录之后 不直接放行,而是 冲定向 到欢迎页面
                    //filterChain.doFilter(request, response);
                    response.sendRedirect(request.getContextPath() + "/login/home.jsp");
                    return;
                }
            }

            //--- 自动登录逻辑  结束------
            response.sendRedirect(request.getContextPath() + "/login/login.jsp");
            return;
        }


    }

    @Override
    public void destroy() {

    }
}